﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Media;


namespace Snake_Xenzia
{
    public partial class Form1 : Form
    {
        const int max=180;
        PictureBox[] pic = new PictureBox[max]; 
        int[] ran = new int[max];
        int ok = 0;
        int move=0;
        int move1;
        int dau, duoi;
        int muctieu=-1;
        int muctieuvip = -1;
        int pro;    //chạy thanh pro
        int dem = 0;    //đếm số lần xuất hiện mục tiêu

        int n=0;
        string[] config = new string[3];
        string theme;
        public Form1()
        {
            InitializeComponent();
        }

        private void hienmuctieu()
        {
            //Hiện mục tiêu cho rắn nhưng không nằm trên thân con rắn
            //và đếm số lần xuất hiện mục tiêu, nếu đạt 5 thì hiện mục tiêu đặc biệt
            Random generator = new Random();
            bool ktra;

            //chọn mục tiêu ngẫu nhiên
            do{
                ktra = false;
                muctieu = (int)(generator.NextDouble() * 180);
                for (int i = 0; i <= duoi; i++)
                    if (muctieu == ran[i])
                        ktra = true;
               }
            while(ktra==true);

            //Hiện mục tiêu
            dem++;
            pic[muctieu].ImageLocation = theme + "\\muctieu.jpg";            
        }


        private void hienmuctieuvip()
        {
            //Hiện mục tiêu cho rắn nhưng không nằm trên thân con rắn
            //và đếm số lần xuất hiện mục tiêu, nếu đạt 5 thì hiện mục tiêu đặc biệt
            Random generator = new Random();
            bool ktra;
            //chọn mục tiêu ngẫu nhiên
                do
                {
                    ktra = false;
                    muctieuvip = (int)(generator.NextDouble() * 180);
                    for (int i = 0; i <= duoi; i++)
                        if (muctieuvip == ran[i]|| muctieuvip==muctieu)
                            ktra = true;
                }
                while (ktra == true);

                //Hiện mục tiêu
                pic[muctieuvip].ImageLocation = theme + "\\muctieuvip.jpg";
                dem = 0;
        }

        private void churan()
        {
            //Khoi tạo bảng hình chứa con rắn
            int k = 0;
            for (int i = 0; i < 12; i++)
                for (int j = 0; j < 15; j++)
                {
                    pic[k] = new PictureBox();
                    pic[k].Name = "pic" + k.ToString();
                    pic[k].Size = new System.Drawing.Size(30, 30);  // kich thuoc        
                    pic[k].Location = new System.Drawing.Point(30 * j, 30 * i); // vi tri xuat hien
                    pic[k].BackColor = System.Drawing.Color.Black;
                    this.panel1.Controls.Add(pic[k]);// them controls vaof Form1       
                    k++;
                }
        }
            
        private void khoitao()
        {
            //Doc file cau hinh
            ReadFile("config.txt", config);

            if (ok == 0)  //File cấu hình không tồn tại cần ghi mới thông tin
            {
                try
                {
                    StreamWriter f = new StreamWriter("config.txt", false, Encoding.Unicode);
                    // Dùng phương thức Write của StreamWriter để ghi ra file văn bản
                    // Cách dùng y như Console.Write hay Console.WriteLine
                    // Trả về giá trị mặc định
                    config[0] = "Snake Xenzia (C) Tran Hoai Duong";
                    config[1] = "No name";
                    config[2] = "000";

                    f.WriteLine(config[0]);
                    f.WriteLine(config[1]);
                    f.WriteLine(config[2]);
                    // Nhớ gọi Close để đóng và lưu file sau khi ghi
                    f.Close();

                }
                catch
                {
                    // Trả về false để báo không ghi file được
                    Console.WriteLine("Can not write to the file.");
                }
            }
            //Hiện thông tin lên Form
            this.la_Dungdau.Text = config[1];
            this.la_Diemso.Text = config[2];



            theme = "theme\\default\\";

            //khoitao con rắn chưa có phần tử nào
            for (int i = 0; i < max; i++)
                ran[i] = -1;

            //Chọn vị trí ngẫu nhiên xuất hiện con rắn
            Random generator = new Random();
            dau = (int)(generator.NextDouble() * 180);
            
            ran[0] = dau;        //Con rắn có 1 phần tử nên pt 0 là đầu con rắn            
            ran[1] = dau - 1;
            ran[2] = dau - 2;
            duoi = 2;

            //hiện con rắn hướng sang phải
            move = 1;
            pic[ran[0]].ImageLocation = theme+"dau1.jpg";
            pic[ran[1]].ImageLocation = theme + "\\minh1.jpg";
            pic[ran[2]].ImageLocation = theme + "\\duoi1.jpg";
            hienmuctieu();
        }

        private void bedau(int dich)
        {
            for (int i = 1; i <=duoi; i++)
            {
                if (dich == ran[i])
                {
                    this.timer1.Enabled = false;
                    SoundPlayer Sound = new SoundPlayer("media//bedau.wav");
                    Sound.Play();
                    this.timer1.Enabled = false;
                    cmdDung.Visible = false;
                    cmdBatdau.Visible = false;
                    cmdKetthuc.Visible = false;

                    //kiem tra xem co diem cao hay khong
                    if (int.Parse(txt_Diem.Text) > int.Parse(config[2]))
                    {
                        try
                        {
                            StreamWriter f = new StreamWriter("config.txt", false, Encoding.Unicode);
                            // Dùng phương thức Write của StreamWriter để ghi ra file văn bản
                            // Cách dùng y như Console.Write hay Console.WriteLine
                            f.WriteLine("Snake Xenzia (C) Tran Hoai Duong");
                            f.WriteLine(txt_Name.Text);
                            f.WriteLine(txt_Diem.Text);
                            // Nhớ gọi Close để đóng và lưu file sau khi ghi
                            f.Close();

                        }
                        catch
                        {
                            // Trả về false để báo không ghi file được
                            Console.WriteLine("Can not write to the file.");
                        }

                        MessageBox.Show("Chuc mung ban lap nen ky luc moi","Chuc mung");
                    }
                    else MessageBox.Show("Ban chua vuot qua ky luc", "Co gang nhe");
                    Newgame();
                }
            }
        }


        private bool trungdich(int tieu)
        {
            bool kq = false;
            if (ran[0] == tieu)
            {
                SoundPlayer Sound = new SoundPlayer("media//trungdich.wav");
                Sound.Play();  
                kq = true;
            }
            return kq;
        }

        private void trungdichvip()
        {
            if (ran[0] == muctieuvip)
            {
                SoundPlayer Sound = new SoundPlayer("media//trungdichvip.wav");
                Sound.Play();
                pic[muctieuvip].ImageLocation = "";
                muctieuvip = -1;
                CongDiemThuong(2*(100-pro));
                this.timer2.Enabled = false;
                pro_thuong.Visible = false;
            }
        }

        private void dichuyen(int dich,int muctieu)
        {
            int tam = ran[duoi];
            
            //dich chuyển theo con răn đồng nghĩa bỏ nốt cuối
            for (int i = duoi; i >0; i--)
            {
                ran[i] = ran[i - 1];
            }
            ran[0] = dich;

            //pic[dich].BackColor = System.Drawing.Color.Blue;

            string strduoi="";

            if ((ran[duoi] == ran[duoi - 1] - 1) || vuotbien(ran[duoi], move)==1)
            {
                strduoi = "duoi1.jpg";
            }
            else if ((ran[duoi] == ran[duoi - 1] + 1)|| vuotbien(ran[duoi], move)==-1)
            {
                strduoi = "duoi2.jpg";
            }
            else if ((ran[duoi] == ran[duoi - 1] + 15) || vuotbien(ran[duoi], move) == 2)
            {
                strduoi = "duoi3.jpg";
            }
            else
            {
                strduoi = "duoi4.jpg";
            }

            pic[ran[duoi]].ImageLocation = theme + strduoi; 

            
            string strdau;

            if (move == 1)
            {
                strdau= "dau1.jpg";
            }
            else if (move == -1)
            {
                strdau = "dau2.jpg";
            }
            else if (move == -15)
            {
                strdau = "dau3.jpg";
            }
            else
            {
                strdau = "dau4.jpg";
            }

            string strminh;
            if (move == 1 || move == -1)
            {
                //Khi hướng trước đó là trái hoặc phải
                strminh = "minh1.jpg";
            }
            else strminh = "minh2.jpg";

            string struon = "";
            //Kiểm tra xem có quẹo cua hay không
            if (move1 == 1)     //hướng trước đó là đi sang phải
            {
                if (move == -15)
                { 
                    struon = "uon3.jpg";
                }
                else if (move == 15)
                { 
                    struon = "uon1.jpg"; 
                }
                move1 = 0;
            }

            if (move1 == -1)     //hướng trước đó là đi sang trái
            {
                if (move == -15)
                {
                    struon = "uon4.jpg";
                }
                else if (move == 15)
                {
                    struon = "uon2.jpg";
                }
                move1 = 0;
            }

            if (move1 == -15)     //hướng trước đó là đi lên trên
            {
                if (move == -1)
                {
                    struon = "uon1.jpg";
                }
                else if (move == 1)
                {
                    struon = "uon2.jpg";
                }
                move1 = 0;
            }


            if (move1 == 15)     //hướng trước đó là đi xuống dưới
            {
                if (move == -1)
                {
                    struon = "uon3.jpg";
                }
                else if (move == 1)
                {
                    struon = "uon4.jpg";
                }
                move1 = 0;
            }
            
            trungdichvip();

            if (trungdich(muctieu)==true)
            {
                //giữ nốt cuối khi trúng mục tiêu
                duoi = duoi + 1;
                ran[duoi] = tam;

                CongDiem();
                hienmuctieu();
                if (dem == 5)
                {
                    pro = 0;    //diem thuong khi trung vip
                    hienmuctieuvip();
                    this.timer2.Enabled = true;
                    pro_thuong.Visible = true;
                }
            }
            else 
            {
            pic[tam].BackColor = System.Drawing.Color.Black;
            pic[tam].ImageLocation = "";                    //bỏ nốt đuôi
            }

            pic[ran[0]].ImageLocation = theme + strdau;

            if (struon != "")   //có sự đổi hướng
                pic[ran[1]].ImageLocation = theme + struon;
            else pic[ran[1]].ImageLocation = theme + strminh;

            bedau(dich);
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            //điều khiển rẳn di chuyển
            bool bHandled = false;
            switch (keyData)
            {   
                    //move1=move để xác định hướng trướng đó
                case Keys.Right:
                    move1 = move;     
                    if (move != -1)    
                        move = 1;
                    bHandled = true;
                    break;
                case Keys.Left:
                    move1 = move;
                    if (move != 1)
                        move = -1;
                    bHandled = true;
                    break;
                case Keys.Up:
                    move1 = move;
                    if (move != 15)
                        move = -15;
                    bHandled = true;
                    break;
                case Keys.Down:
                    move1 = move;
                    if (move != -15)    
                        move = 15;
                    bHandled = true;
                    break;
            }
            return bHandled;
        }

        private int songuyenduong(string chuoi)
        {
	    int flag = 0;
	    try
	    {
		// Kiểm tra chuỗi có phải số nguyên không
		// Nếu không thì sẽ quăng ra một exception; gán flag = false;
		// Nếu là số nguyên thì gán flag = true;
		int temp = int.Parse(chuoi);
        if (temp >= 0)
        { flag = 1; }
	    }
	    catch
	    {
    		flag = 0;
	    }
	    return flag;
        }


        private void ReadFile(string filename, string[] strs)
        {
            try
            {
                StreamReader f = new StreamReader(filename);
                for (int i = 0; i < 3; i++)
                    strs[i] = f.ReadLine().Trim();
               
                //Nếu đúng định dạng thì cho ok=1;
                if (songuyenduong(strs[2]) > 0)
                { ok = 1; }

                f.Close();
            }
            catch
            {
                // Trả về null nếu trong quá trình đọc file có sự cố
                Console.WriteLine("Khong doc duoc");
            }
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
            
            churan();
            khoitao();
            
            //Thêm mức độ
            this.combo_Muc.Items.Add("0");
            this.combo_Muc.Items.Add("1");
            this.combo_Muc.Items.Add("2");
            this.combo_Muc.Items.Add("3");
            this.combo_Muc.Items.Add("4");
            this.combo_Muc.SelectedIndex=2;
        }

        private void CongDiem()
        {
            txt_Diem.Text = (int.Parse(txt_Diem.Text) + 6).ToString();
        }

        private void CongDiemThuong(int diem)
        {
            txt_Diem.Text = (int.Parse(txt_Diem.Text) + diem).ToString();
        }

        private int vuotbien(int dau, int move)
        {
            //kiểm tra xem con rắn có vượt biên hay không
            int kq=0;
            if (dau % 15 == 0 && (dau + move-14) % 15 == 0)
            {
                kq = -1;    //vuotbien trái
            }
            else if ((dau-14) % 15 == 0 && (dau + move) % 15 == 0)
            {
            kq = 1;     //vuotbien phải
            }
            else if (dau >=165 && (dau + move) >= 180)
            {
                kq = -2;    //vuotbien dưới
            }
            else if (dau <= 14 && (dau + move) < 0)
            {
                kq = 2;     //vuotbien trên
            }
            return kq;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            
            dau = ran[0];
            int dich = dau + move;
            if (vuotbien(dau, move) == -1)
            {
                dich = dau +14;
            }
            else if (vuotbien(dau, move) == 1)
            {
                dich = dau -14;
            }
            else if (vuotbien(dau, move) == -2)
            {
                dich = dau %15;
            }
            else if (vuotbien(dau, move) == 2)
            {
                dich = dau + 165;
            }

            dichuyen(dich,muctieu);
        }
        private void Newgame()
        {
            timer1.Enabled = false;
            for (int i = 0; i < max; i++)
            {
                pic[i].ImageLocation = "";
            }
            khoitao();
            combo_Muc.Enabled = true;
            txt_Diem.Text = "0";
            cmdBatdau.Visible = true;     
        }

        private void ketthuc()
        {
            timer1.Enabled = false;
            // Khai báo bi ến traloi
            DialogResult traloi;
            // Hi ện hộp thoại hỏi đáp
            traloi = MessageBox.Show("Ban muon ket thuc chuong trinh?", "Ket thuc",
            MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            // Ki ểm tra  có nh ắp chọn nút Ok không?
            if (traloi == DialogResult.OK) Application.Exit();
            else timer1.Enabled = true;
        }

        private void combo_Muc_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (combo_Muc.SelectedIndex == 0)
            {
                this.timer1.Interval = 300;
            }
            else if (combo_Muc.SelectedIndex == 1)
            {
                this.timer1.Interval = 250;
            }
            else if (combo_Muc.SelectedIndex == 2)
            {
                this.timer1.Interval = 200;
            }
            else if (combo_Muc.SelectedIndex == 3)
            {
                this.timer1.Interval = 150;
            }
            else 
            {
                this.timer1.Interval = 100;
            }

        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            pro++;
            pro_thuong.Value = pro;
            
            if (pro>=100)
            {
                pic[muctieuvip].ImageLocation = "";
                muctieuvip = -1;
                this.timer2.Enabled=false;
                pro_thuong.Visible = false;
            }
        }

        private void cmdTiep_Click(object sender, EventArgs e)
        {
            cmdTiep.Visible = false;
            cmdDung.Visible = true;
            this.timer1.Enabled = true;
        }

        private void cmdDung_Click(object sender, EventArgs e)
        {
            this.timer1.Enabled = false;
            cmdDung.Visible = false;
            cmdTiep.Visible = true;
        }

        private void cmdBatdau_Click(object sender, EventArgs e)
        {
            this.timer1.Enabled = true;
            cmdBatdau.Visible  = false;
            cmdKetthuc.Visible = true;
            cmdDung.Visible = true;
            combo_Muc.Enabled = false;
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Newgame();        
        }

        private void exitToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            ketthuc();
        }

        private void helpToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show( "Dung cac phim mui ten de dieu khien ran can trung muc tieu\n Nhanh tay de can trung muc tieu quan trong de duoc nhieu diem","Huong dan");
        }

        private void infoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show( "Ban quyen thuoc ve Tran Hoai Duong\n Email: duonhoa@gmail.com","Tac gia");
        }

        private void cmdKetthuc_Click(object sender, EventArgs e)
        {
            ketthuc();
        }
    }
}
